#ifndef __WIZ_ALGEBRA_MATRIX_BASE_HPP__SHANHAOBO_19800429__
#define __WIZ_ALGEBRA_MATRIX_BASE_HPP__SHANHAOBO_19800429__

namespace Wiz
{
    namespace Matrix
    {
        namespace Base
        {
#       pragma pack(push, 1)
            template<typename ElementT, int NRow, int NCol>
            struct Type
            {
                ////////////////////////////////////////////////////////////////
                enum
                {
                    eRowCnt = NRow,
                    eColCnt = NCol,
                    eCount = eRowCnt * eColCnt
                };
                ////////////////////////////////////////////////////////////////
                typedef ElementT        tElement;
                typedef tElement        tElementArray[eCount];
                typedef tElement        tElementRow[eColCnt];
                typedef tElement        tElementColumn[eRowCnt];
                ////////////////////////////////////////////////////////////////
                union
                {
                    struct
                    {
                        tElementArray   eAll;
                    };
                    struct 
                    {
                        tElement        e[eRowCnt][eColCnt];
                    };
                    struct 
                    {
                        tElementRow     v[eRowCnt];
                    };
                };
                ////////////////////////////////////////////////////////////////
                Type()
                {
                    ::Wiz::Size::Type i, j;

                    for (j = 0; j < eRowCnt; j++)
                    {
                        for (i = 0; i < eColCnt; i++)
                        {
                            this->e[j][i] = 0;
                        }
                    }
                }
                Type(const tElement& InEle)
                {
                    ::Wiz::Size::Type i, j;

                    for (j = 0; j < eRowCnt; j++)
                    {
                        for (i = 0; i < eColCnt; i++)
                        {
                            this->e[j][i] = InEle;
                        }
                    }
                }
                Type(const Type& InMat)
                {
                    ::Wiz::Size::Type i, j;

                    for (j = 0; j < eRowCnt; j++)
                    {
                        for (i = 0; i < eColCnt; i++)
                        {
                            this->e[j][i] = InMat.e[j][i];
                        }
                    }
                }
            };
#       pragma pack(pop)
        } /// end of namespace Base
    } /// end of namespace Matrix
} /// end of namespace Wiz

#endif /*__WIZ_ALGEBRA_MATRIX_BASE_HPP__SHANHAOBO_19800429__*/
